/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package reputacao;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 *
 * @author marapao
 */
public class ReputacaoOntologica {

    List<DadosReputacaoOntologica> reputacaoOntologica;

    public List<DadosReputacaoOntologica> getReputacaoOntologica() {
        return reputacaoOntologica;
    }

    public void setReputacaoOntologica(List<DadosReputacaoOntologica> reputacaoOntologica) {
        this.reputacaoOntologica = reputacaoOntologica;
    }

    public ReputacaoOntologica(List<DadosReputacaoOntologica> reputacaoOntologica) {
        this.reputacaoOntologica = reputacaoOntologica;
    }

    public ReputacaoOntologica() {
        this.reputacaoOntologica = new ArrayList<DadosReputacaoOntologica>();
    }

    public DadosReputacaoOntologica calculaReputacaoOntologica(String agenteAlvo, String agenteAvaliador, String tipo, ReputacaoIndividual ri, ReputacaoSocial rs) {
        DadosReputacaoIndividual rind = ri.reputacoesIndividual(agenteAlvo, agenteAvaliador, tipo);
        DadosReputacaoSocial rsoc = rs.reputacaoSocial(agenteAlvo, tipo);

        if (rind == null || rsoc == null) {
            return null;
        }


        double rep = (rind.getValor() * rind.getTempo() + rsoc.getValor() * rsoc.getTempo()) /
                (rind.getTempo() + rsoc.getTempo());

        DadosReputacaoOntologica result = new DadosReputacaoOntologica(agenteAlvo, agenteAvaliador, rep);

        return result;
    }

    public void remove(String avaliador, String alvo) {
        List<DadosReputacaoOntologica> remocao = new ArrayList<DadosReputacaoOntologica>();

        for (DadosReputacaoOntologica dados : reputacaoOntologica) {
            if(dados != null)
            if (dados.getAgenteAlvo().equals(alvo) &&
                    dados.getAgenteAvaliador().equals(avaliador)) {
                remocao.add(dados);
            }
        }

        reputacaoOntologica.removeAll(remocao);

    }

    public void insere(DadosReputacaoOntologica dados) {
        reputacaoOntologica.add(dados);
    }

    public void atualiza(String agenteAlvo, String agenteAvaliador, String tipo, ReputacaoIndividual ri, ReputacaoSocial rs) {
        remove(agenteAvaliador, agenteAlvo);
        insere(calculaReputacaoOntologica(agenteAlvo, agenteAvaliador, tipo, ri, rs));


    }

    //olhar essa função melhor
    public void ordena() {
        List<DadosReputacaoOntologica> remove = new ArrayList<DadosReputacaoOntologica>();
        List<DadosReputacaoOntologica> ordenado = new ArrayList<DadosReputacaoOntologica>();
        DadosReputacaoOntologica maior = new DadosReputacaoOntologica();
        maior.setReputacao(-1);

        if (reputacaoOntologica.size() > 1) {
            while (!reputacaoOntologica.isEmpty()) {
                for (DadosReputacaoOntologica dados : reputacaoOntologica) {
                    if (dados != null) {
                        if (maior.getReputacao() <= dados.getReputacao()) {
                            maior = dados;
                        }
                    }
                }
                ordenado.add(maior);
                remove.add(maior);
                reputacaoOntologica.removeAll(remove);

            }
            setReputacaoOntologica(ordenado);
        }
        else
            setReputacaoOntologica(reputacaoOntologica);
    }

    public DadosReputacaoOntologica retornaReputacaoOntologica(String agenteAlvo, String agenteAvaliador) {

        for (DadosReputacaoOntologica ro : reputacaoOntologica) {
            if (ro.getAgenteAlvo().equals(agenteAlvo) && ro.getAgenteAvaliador().equals(agenteAvaliador)) {
                return ro;
            }
        }

        return null;
    }
}
